package jheej5024;

import java.util.Scanner;

public class J32_Exception {

	//예외처리 exception
	//오류 처리는 프로그래밍 언어의 중요한 기능임
	//좋은 오류 처리 매커니즘은 프로그래머가 보다 쉽게 강력한 프로그램을 작성하고
	//몰래 섞여 들어오는 버그를 방지할 수 있음
	
	//일부 언어에서는 발생가능한 모든 오류를
	//미리 감지하기 위해 강제로 다중 if문을 사용
	//이런 경우 코드가 지나치게 복잡해 짐
	
	//자바에서는 try문을 사용하여
	//보다 쉽게 오류를 감지하고 처리
	
	//오류error vs 예외exception
	//프로그램의 정상실행을 방해하는 요소
	//오류:프로그램의 잘못된 코드나
	//    CPU연산의 잘못된 동작으로 발생
	//    컴파일 오류, 실행시간 오류로 다시 분류
	//*컴파일 오류 : 잘못된 문법으로 인해 발생된 오류
	//실행시간 오류 : 잘못된 코드 사용이나 하드웨어의 오동작으로 인한 오류
	//하드웨어적으로 발생하는 오류를 제오하고
	//모든 오류는 개발자가 적절히 수정가능
	
	//예외:일반적인 프로그램 실행 순서를 벗어나는것
	//프로그램 상에서 코드에 의해 예외를 바로 잡을 수 있음
	//즉,위에서 언급한오류들은 코드에 의해 수습할 수 있는
	//미약한 오류하는 의미도 있음
	
	//실행시간 오류가 생길 것 같은 코드는
	//일반적으로 try - catch - finally 문으로 격리 가능
	//오류가 발생하면 try 블록의 처리를 중단하고
	//catch 블록으로 제어가 넘어감
	
	
	public static void main(String[] args) {
    //오류가 발생하는 경우
		System.out.println("이 글이 보이나요?");
        try{
		System.out.println(100/0);
        }catch(Exception e){
        	//
        	System.out.println("0으로 나눌수 없어요!");
        	//e.printStackTrace();
        	System.out.println(e.getMessage());
        
        }
		System.out.println("이 글도 보이나요?");
	
		
		// 1 ~ 10사이 정수를 받아 출력하는 프로그램
		Scanner sc = new Scanner(System.in);
		
		//while(true) {
		System.out.println("1 - 10사이 정수를 입력하세요");
		int num = 0;
		try{
		num = sc.nextInt();
		}catch (Exception e) {
			System.err.println("오류발생, 다시 입력하세요");
			//이전에 입력한 내용이 문자인 경우
			//Scanner 내부 저장소(버퍼)에 남아있기 때문에
			//계속 무한반복으로 위 문장이 출력됨
			//Scanner를 다시 초기화해야만 문제가 해결
			sc=new Scanner(System.in);
		}
		if (num>=1 && num<=10);
		System.out.println("입력하신 정수는" + num);
		

		//예외처리 1
		int[] name = new int[3];
		try{
		name[0]=1;
		name[1]=2;
		name[2]=3;
		name[3]=4;
		
		}catch (Exception ex) {
			System.err.println("배열 크기를 초과");
		}
		
		
		
		//예외처리 2
		int result = 0;
		try{
		for(int i =10; i>=0; --i){
			result += (int)(Math.random()*100)/i;
			System.out.println(result);
			}
		} 
		
		catch(Exception e){
		System.err.println("0으로 나눌수 없어요");
		}
		
		System.out.println(result);
	
	

	
	//다중 예외 처리
	/*try{
	System.out.println(100/0);
	char[]grade = new char[3];
	grade[3]='a';
	}catch(Exception e) {
		System.out.println("0으로 나누지 못함");
	
	*/
	
	try{
	//
		System.out.println(100/0);
	char[]grade = new char[3];
	grade[3]='a';
	}catch(ArithmeticException ae) {
		System.err.println("0으로 나누지 못함");
	}catch(ArrayIndexOutOfBoundsException aiobe){
		System.err.println("배열의 범위를 벗어났어요");
	}catch(Exception e){
		System.err.println("알수없는 오류발생!!");	
	}	
	//코드에서 발생할 수 있는 예외가
	//하나 이상인 경우 다중 catch 문으로
	//각각의 예외에 따라 독자적인 오류처리를 할수있음
	
}
	
	
}

	


